import { ObjectStackInstance } from './type';
// 对象栈类
export class ObjectStack<T> {
    private stack: ObjectStackInstance<T>;
    private size: number;
    // 构造函数
    constructor() {
        this.stack = {};
        this.size = 0;
    }
    // 入栈
    push(item: T) {
        this.stack[this.size] = item;
        this.size++;
    }
    // 判断是否为空
    isEmpty(): boolean {
        return this.size === 0;
    }
    // 出栈方法
    pop(): T | undefined {
        if (this.isEmpty()) return undefined;
        this.size--;
        const res: T = this.stack[this.size];
        delete this.stack[this.size];
        return res;
    }
    // 返回栈顶元素方法
    peek(): T | undefined {
        if (this.isEmpty()) return undefined;
        return this.stack[this.size - 1];
    }
    // 清空方法
    clear() {
        this.stack = {};
        this.size = 0;
    }
    // 得到长度方法
    getSize(): number {
        return this.size;
    }
    // 字符串化方法
    stringfy(): string {
        let res = '';
        for (let i = 0; i < this.size; i++) {
            res = res + this.stack[i] + ','
        }
        return res.slice(0, -1);
    }
}

// 测试用例
const stack = new ObjectStack<string>();
// 边缘情况测试
console.log(stack.peek(), stack.pop(), stack.isEmpty());

// 入栈
stack.push("第一条数据");
stack.push("第二条数据");

// 出栈
stack.pop();

// 返回栈顶元素
console.log(stack.peek());

// 查看栈大小
console.log(stack.getSize());

// 判断栈是否为空
console.log(stack.isEmpty());

// 返回栈内所有元素
console.log(stack.stringfy())

// 清空栈
stack.clear();
console.dir(stack);
